/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package szerelomuhelynyilvantartas;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Calendar;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

/**
 *
 * @author csatari
 */
public class MunkalapMenü extends JFrame {
    Munkalap munkalap = null;
    int munkalapIndex;
    DefaultListModel l = new DefaultListModel();
    DefaultComboBoxModel<String> c = new DefaultComboBoxModel<>();
    JList list = new JList(l);
    JComboBox<String> szerelőLista = new JComboBox<>(c);
    
    JTextField tulajNév = new JTextField(50);
    JTextField tulajCím = new JTextField(75);
    JTextField tulajTelefonszám = new JTextField(12);
    JTextField autóGyártmány = new JTextField(50);
    JTextField autóTípus = new JTextField(50);
    JTextField autóRendszám = new JTextField(10);
    JTextField autóKmÓra = new JTextField(15);
    
    
    JCheckBox kifizetve = new JCheckBox();
    
    JButton árButton = new JButton("Ár kifejtése");
    JButton tételHozzáadButton = new JButton("Tétel hozzáadása");
    JButton tételSzerkesztButton = new JButton("Tétel szerkesztése");
    JButton tételTörlésButton = new JButton("Tétel törlése");
    JButton kimentés = new JButton("Kimentés");
    
    JLabel szerelőÓradíj = new JLabel();
    JLabel szerelésiIdő = new JLabel();
    JLabel szerelésiÁr = new JLabel();
    
    public Munkalap getMunkalap() {
        return munkalap;
    }
    public MunkalapMenü(Munkalap munkalap, int index) {
        this.munkalap = munkalap;
        this.munkalapIndex = index;
        rajzolMenü();
    }
    public MunkalapMenü() {
        for(Szerelő szerelő : SzereloMuhelyNyilvantartas.szerelők) {
            c.addElement(szerelő.getNév());
        }
        munkalapIndex = SzereloMuhelyNyilvantartas.munkalapok.size();
        rajzolMenü();
    }
    private void rajzolMenü() {
        int i=1;
        if(munkalap!=null) {
            setTitle("Munkalap: "+munkalap.getTulajdonos().getNév() + ", " + munkalap.getAutó().getGyártmány() + " "
                    + munkalap.getAutó().getTípus());
            for(Tétel tétel : munkalap.getTételek()) {
                if(tétel instanceof Alkatrész) {
                    l.addElement(i+". tétel: alkatrész");
                }
                else if(tétel instanceof Anyag) {
                    l.addElement(i+". tétel: anyag");
                }
                else if(tétel instanceof Munkafolyamat) {
                    l.addElement(i+". tétel: munkafolyamat");
                }
                i++;
            }
            adatBeállítás();
        }
        else {
            setTitle("Új munkalap");
        }
        setSize(new Dimension(600, 350));
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener( new WindowAdapter()
        {
            @Override
            public void windowClosing(WindowEvent e)
            {
                try {
                    mentés();
                    dispose();
                }
                catch(Exception ex) {
                    JOptionPane.showMessageDialog(rootPane, ex.getMessage());
                }
            }
        });
        setLocationRelativeTo(null);
        
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout(10,0));
        
        JScrollPane listPane = new JScrollPane(list);
        listPane.setPreferredSize(new Dimension(250,200));
        
        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(0,2));
        centerPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
        centerPanel.setPreferredSize(new Dimension(100,200));
        
        árButton.addActionListener(new ÁrLekérdezésListener());
        tételHozzáadButton.addActionListener(new TételKiválasztásListener());
        tételSzerkesztButton.addActionListener(new TételSzerkesztListener());
        tételTörlésButton.addActionListener(new TételTörölListener());
        kimentés.addActionListener(new KimentésListener());
        
        centerPanel.add(new JLabel("Tulaj adatai:"));
        centerPanel.add(new JLabel());
        centerPanel.add(new JLabel("Név:"));
        centerPanel.add(tulajNév);
        centerPanel.add(new JLabel("Cím:"));
        centerPanel.add(tulajCím);
        centerPanel.add(new JLabel("Telefonszám:"));
        centerPanel.add(tulajTelefonszám);
        centerPanel.add(new JLabel("Szerelő adatai:"));
        centerPanel.add(new JLabel());
        if(munkalap!=null) {
            centerPanel.add(new JLabel("Név:"));
            centerPanel.add(new JLabel(munkalap.getMunkaFelvevő().getNév()));
            centerPanel.add(new JLabel("Óradíj:"));
            centerPanel.add(new JLabel(munkalap.getMunkaFelvevő().getÓradíj()+" Ft"));
        }
        else {
            centerPanel.add(new JLabel("Név:"));
            centerPanel.add(szerelőLista);
            centerPanel.add(new JLabel("Óradíj:"));
            centerPanel.add(szerelőÓradíj);
            szerelőLista.addActionListener(new SzerelőListListener());
            szerelőLista.setSelectedIndex(0);
        }
        centerPanel.add(new JLabel("Autó adatai:"));
        centerPanel.add(new JLabel());
        centerPanel.add(new JLabel("Gyártmány:"));
        centerPanel.add(autóGyártmány);
        centerPanel.add(new JLabel("Típus:"));
        centerPanel.add(autóTípus);
        centerPanel.add(new JLabel("Rendszám:"));
        centerPanel.add(autóRendszám);
        centerPanel.add(new JLabel("Km-óra állás:"));
        centerPanel.add(autóKmÓra);
        centerPanel.add(new JLabel("Kifizetve:"));
        centerPanel.add(kifizetve);
        centerPanel.add(new JLabel("Szerelési idő:"));
        centerPanel.add(szerelésiIdő);
        centerPanel.add(new JLabel("Teljes ár:"));
        centerPanel.add(szerelésiÁr);
        centerPanel.add(árButton);
        centerPanel.add(tételHozzáadButton);
        centerPanel.add(tételSzerkesztButton);
        centerPanel.add(tételTörlésButton);
        centerPanel.add(kimentés);
        
        panel.add(listPane, BorderLayout.LINE_START);
        panel.add(centerPanel,BorderLayout.CENTER);
        
        add(panel);
    }
    private void adatBeállítás() {
        tulajNév.setText(munkalap.getTulajdonos().getNév());
        tulajCím.setText(munkalap.getTulajdonos().getCím());
        tulajTelefonszám.setText(munkalap.getTulajdonos().getTelefonszám());
        autóGyártmány.setText(munkalap.getAutó().getGyártmány());
        autóTípus.setText(munkalap.getAutó().getTípus());
        autóRendszám.setText(munkalap.getAutó().getRendszám());
        autóKmÓra.setText(Integer.toString(munkalap.getAutó().getKmÓraÁllás()));
        kifizetve.setSelected(munkalap.isKifizetve());
        szerelésiIdő.setText(munkalap.getTeljesSzerelésiIdő()+" óra");
        szerelésiÁr.setText(munkalap.getTeljesÁr()+" Ft");
    }
    private void mentés() throws Exception {
        
        if(munkalapIndex != SzereloMuhelyNyilvantartas.munkalapok.size()) {
            Calendar felvételIdőpont;
            Munkalap mentendő;
            int autóKM;
            try {
                autóKM = Integer.parseInt(autóKmÓra.getText());
            }
            catch(NumberFormatException ex) {
                autóKM = 0;
            }
            Szerelő szerelő = Szerelő.keresSzerelő(munkalap.getMunkaFelvevő().getNév());
            Autó autó = new Autó(autóRendszám.getText(),autóGyártmány.getText(),
                    autóTípus.getText(),autóKM);
            Tulaj tulaj = new Tulaj(tulajNév.getText(),tulajCím.getText(),tulajTelefonszám.getText());

            felvételIdőpont = munkalap.getFelvételIdőpont();
            mentendő = new Munkalap(szerelő,autó,tulaj);
            for(Tétel tétel : munkalap.getTételek()) {
                if(tétel instanceof Alkatrész) {
                    mentendő.hozzáad((Alkatrész)tétel);
                }
                else if(tétel instanceof Anyag) {
                    mentendő.hozzáad((Anyag)tétel);
                }
                else if(tétel instanceof Munkafolyamat) {
                    mentendő.hozzáad((Munkafolyamat)tétel);
                }
            }
            mentendő.setFelvételIdőpont(felvételIdőpont);

            mentendő.setKifizetve(kifizetve.isSelected());
            SzereloMuhelyNyilvantartas.munkalapok.set(munkalapIndex, mentendő);
            Főmenü.refreshFőmenü(munkalapIndex);
        }
        else {
            int autóKM;
            try {
                autóKM = Integer.parseInt(autóKmÓra.getText());
            }
            catch(NumberFormatException ex) {
                autóKM = 0;
            }
            Szerelő szerelő = SzereloMuhelyNyilvantartas.szerelők.get(szerelőLista.getSelectedIndex());
            Autó autó = new Autó(autóRendszám.getText(),autóGyártmány.getText(),autóTípus.getText(),
                    autóKM);

            Tulaj tulaj = new Tulaj(tulajNév.getText(),tulajCím.getText(),tulajTelefonszám.getText());
            munkalap = new Munkalap(szerelő,autó,tulaj);
            munkalap.setKifizetve(kifizetve.isSelected());
            SzereloMuhelyNyilvantartas.munkalapok.add(munkalap);
            Főmenü.refreshFőmenü(munkalapIndex);
        }
    }
    public void refreshMunkalapMenü() {
        l.clear();
        int i=1;
        if(munkalap!=null) {
            setTitle("Munkalap: "+munkalap.getTulajdonos().getNév() + ", " + munkalap.getAutó().getGyártmány() + " "
                    + munkalap.getAutó().getTípus());
            for(Tétel tétel : munkalap.getTételek()) {
                if(tétel instanceof Alkatrész) {
                    l.addElement(i+". tétel: alkatrész");
                }
                else if(tétel instanceof Anyag) {
                    l.addElement(i+". tétel: anyag");
                }
                else if(tétel instanceof Munkafolyamat) {
                    l.addElement(i+". tétel: munkafolyamat");
                }
                i++;
            }
            adatBeállítás();
        }
    }
    private class SzerelőListListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            Szerelő kiválasztott = SzereloMuhelyNyilvantartas.szerelők.get(szerelőLista.getSelectedIndex());
            szerelőÓradíj.setText(kiválasztott.getÓradíj()+" Ft");
        }
    }
    private class ÁrLekérdezésListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            if(munkalapIndex != SzereloMuhelyNyilvantartas.munkalapok.size()) {
                StringBuilder sb = new StringBuilder();
                sb.append("Teljes árlista: \n");
                int i=1;
                for(Tétel tétel : munkalap.getTételek()) {
                    if(tétel instanceof Alkatrész) {
                        Alkatrész a = (Alkatrész)tétel;
                        sb.append(i).append(". alkatrész, ").append(a.getNév())
                                .append(": ").append(a.getÁr()).append(" Ft\n");
                    }
                    else if(tétel instanceof Anyag) {
                        Anyag a = (Anyag)tétel;
                        sb.append(i).append(". anyag, ").append(a.getNév())
                                .append(", mennyiség: ").append(a.getMennyiség()).append(", egységár: ")
                                .append(a.getDarabÁr()).append(" Ft: ").append(a.getÁr()).append(" Ft\n");
                    }
                    else if(tétel instanceof Munkafolyamat) {
                        Munkafolyamat a = (Munkafolyamat)tétel;
                        sb.append(i).append(". munkafolyamat, szerelő: ")
                                .append(a.getSzerelő().getNév()).append(", szerelési idő: ")
                                .append(a.getSzerelésiIdő()).append(" óra : ").append(a.getÁr()).append(" Ft\n");
                    }
                    i++;
                }
                sb.append("Teljes ár: ").append(munkalap.getTeljesÁr()).append(" Ft");
                JOptionPane.showMessageDialog(rootPane, sb.toString());
            }
        }
    }
    private class TételKiválasztásListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            if(munkalapIndex == SzereloMuhelyNyilvantartas.munkalapok.size()) {
                try {
                    mentés();
                }
                catch(Exception ex) {
                    JOptionPane.showMessageDialog(rootPane, ex.getMessage());
                }
            }
            if(munkalapIndex != SzereloMuhelyNyilvantartas.munkalapok.size()) {
                JFrame frame = new JFrame("Tétel hozzáadás");
                Object[] possibilities = {"Munkafolyamat", "Anyag", "Alkatrész"};
                try {
                    String válasz = (String) JOptionPane.showInputDialog(
                            frame,"Milyen fajta tétel legyen?","Tétel választás",
                            JOptionPane.QUESTION_MESSAGE, null, possibilities,"Munkafolyamat");
                    switch (válasz) {
                        case "Munkafolyamat":
                            MunkafolyamatMenü munkafMenü = new MunkafolyamatMenü(munkalapIndex);
                            munkafMenü.setVisible(true);
                            munkafMenü.addWindowListener(new TételMenüListener());
                            break;
                        case "Anyag":
                            AnyagMenü anyMenü = new AnyagMenü(munkalapIndex);
                            anyMenü.setVisible(true);
                            anyMenü.addWindowListener(new TételMenüListener());
                            break;
                        case "Alkatrész":
                            AlkatrészMenü alkMenü = new AlkatrészMenü(munkalapIndex);
                            alkMenü.setVisible(true);
                            alkMenü.addWindowListener(new TételMenüListener());
                            break;
                    }
                }
                catch(NullPointerException ex) {
                    System.out.println("Kilépett");
                }
            }
            
            
        }
        
    }
    private class TételSzerkesztListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            int kiválasztott = list.getSelectedIndex();
            if(kiválasztott >= 0) {
                Tétel kiválasztottTétel = SzereloMuhelyNyilvantartas.munkalapok.get(munkalapIndex).getTételek().get(kiválasztott);
                if(kiválasztottTétel instanceof Munkafolyamat) {
                    MunkafolyamatMenü munkaFM = new MunkafolyamatMenü(munkalapIndex,(Munkafolyamat)kiválasztottTétel,kiválasztott);
                    munkaFM.setVisible(true);
                    munkaFM.addWindowListener(new TételMenüListener());
                }
                else if(kiválasztottTétel instanceof Alkatrész) {
                    AlkatrészMenü alkM = new AlkatrészMenü(munkalapIndex,(Alkatrész)kiválasztottTétel,kiválasztott);
                    alkM.setVisible(true);
                    alkM.addWindowListener(new TételMenüListener());
                }
                else if(kiválasztottTétel instanceof Anyag) {
                    AnyagMenü anyagM = new AnyagMenü(munkalapIndex,(Anyag)kiválasztottTétel,kiválasztott);
                    anyagM.setVisible(true);
                    anyagM.addWindowListener(new TételMenüListener());
                }
            }
        }
        
    }
    private class TételTörölListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            int kiválasztott = list.getSelectedIndex();
            if(kiválasztott >= 0) {
                SzereloMuhelyNyilvantartas.munkalapok.get(munkalapIndex).deleteTétel(kiválasztott);
                refreshMunkalapMenü();
            }
        }
        
    }
    private class KimentésListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(list.getSelectedIndex() >= 0) {
                munkalap.mentés();
                JOptionPane.showMessageDialog(rootPane, "Kimentve a következő fájlba: "+munkalap.getTulajdonos().getNév()+"_nyomtathato.txt");
            }
        }
    }
    private class TételMenüListener implements WindowListener {
        @Override
        public void windowOpened(WindowEvent e) {
        }

        @Override
        public void windowClosing(WindowEvent e) {
        }

        @Override
        public void windowClosed(WindowEvent e) {
            refreshMunkalapMenü();
        }

        @Override
        public void windowIconified(WindowEvent e) {
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
        }

        @Override
        public void windowActivated(WindowEvent e) {
        }

        @Override
        public void windowDeactivated(WindowEvent e) {
        }
        
    }
    
}
